package com.manage.platform.utils;

import cn.hutool.core.util.ObjectUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * PDF转图片
 */
public class ImageUtil {

  public static final int DEFAULT_DPI = 150;

  private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ImageUtil.class);

  /**
   * 将宽度相同的图片，竖向追加在一起 ##注意：宽度必须相同
   *
   * @param picList 文件流数组
   * @param outPath 输出路径
   */
  public static void yPic(List<BufferedImage> picList, String outPath) {// 纵向处理图片
    if (picList == null || picList.size() <= 0) {
      log.info("图片数组为空!");
      return;
    }
    try {
      // 总高度
      int height = 0,
        // 总宽度
        width = 0,
        // 临时的高度 , 或保存偏移高度
        offsetHeight = 0,
        // 临时的高度，主要保存每个高度
        tmpHeight = 0,
        // 图片的数量
        picNum = picList.size();
      // 保存每个文件的高度
      int[] heightArray = new int[picNum];
      // 保存图片流
      BufferedImage buffer = null;
      // 保存所有的图片的RGB
      List<int[]> imgRgb = new ArrayList<int[]>();
      // 保存一张图片中的RGB数据
      int[] tmpImgRgb;
      for (int i = 0; i < picNum; i++) {
        buffer = picList.get(i);
        // 图片高度
        heightArray[i] = offsetHeight = buffer.getHeight();
        if (i == 0) {
          // 图片宽度
          width = buffer.getWidth();
        }
        // 获取总高度
        height += offsetHeight;
        // 从图片中读取RGB
        tmpImgRgb = new int[width * offsetHeight];
        tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);
        imgRgb.add(tmpImgRgb);
      }
      // 设置偏移高度为0
      offsetHeight = 0;
      // 生成新图片
      BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      for (int i = 0; i < picNum; i++) {
        tmpHeight = heightArray[i];
        if (i != 0) {
          // 计算偏移高度
          offsetHeight += tmpHeight;
        }
        // 写入流中
        imageResult.setRGB(0, offsetHeight, width, tmpHeight, imgRgb.get(i), 0, width);
      }
      File outFile = new File(outPath);
      // 写图片
      ImageIO.write(imageResult, "png", outFile);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * PDF转图片
   *
   * @param filePath 图片路径
   * @return PDF页码数
   */
  public static Integer pdfConvertImage(String filePath) {
    try {
      final String[] split = filePath.split("\\.pdf");

      // 将pdf装图片 并且自定义图片得格式大小
      File file = new File("/oss/" + filePath);
      PDDocument doc = PDDocument.load(file);
      PDFRenderer renderer = new PDFRenderer(doc);
      //BufferedImage image = renderer.renderImageWithDPI(0, 72); // Windows native DPI
      final int count = doc.getPages().getCount();
      for (int i = 0; i < count; i++) {
        BufferedImage image = renderer.renderImage(i, 1);
        ImageIO.write(image, "jpeg", new File("/oss/" + split[0] + "-" + i + ".jpeg"));
      }
      doc.close();
      return count;
    } catch (Exception e) {
      log.error("转换PDF为图片pdf2png出错：", e);
    }
    return 0;
  }


  /**
   * pdf转图片
   * 多页PDF会每页转换为一张图片，下面会有多页组合成一页的方法
   *
   * @param pdfFile pdf文件路径
   * @param outPath 图片输出路径
   * @param dpi     相当于图片的分辨率，值越大越清晰，但是转换时间变长
   */
  public static void pdf2multiImage(String pdfFile, String outPath, int dpi) {
    if (ObjectUtil.isEmpty(dpi)) {
      // 如果没有设置DPI，默认设置为150
      dpi = DEFAULT_DPI;
    }
    // 将pdf装图片 并且自定义图片得格式大小

    try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {
      int actSize = pdf.getNumberOfPages();
      List<BufferedImage> picList = new ArrayList<>();
      PDFRenderer renderer = new PDFRenderer(pdf);
      for (int i = 0; i < actSize; i++) {
        BufferedImage image = renderer.renderImage(i, 1);
        picList.add(image);
      }
      // 组合图片
      ImageUtil.yPic(picList, outPath);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}